#pragma once
#include <string>
#include <functional>
#include <mutex>
#include <map>
#include <typeindex> // 添加type_index支持

using Callback = std::function<void()>;
class Event
{
private:
    Event() = default;                        // 使用default实现
    ~Event() = default;                       // 使用default实现
    Event(const Event &) = delete;            // 禁用拷贝构造
    Event &operator=(const Event &) = delete; // 禁用赋值操作符

    
    std::vector<Callback> _listeners;
public:
    static Event &getInstance();
    void on(Callback callback);
    void emit();
}; 

// /**
//  * 默认事件
//  */
// struct DefaultEvent
// {
//     std::string eventName;
// };
// /**
//  * 触摸事件
//  */
// struct TouchStartEvent
// {
//     std::string eventName;
// };
// struct TouchMoveEvent
// {
//     std::string eventName;
// };
// struct TouchEndEvent
// {
//     std::string eventName;
// };

// struct EventHandler
// {
//     std::string classPtr; // 类指针
//     std::function<void(const void *)> callback;
// };
// std::mutex mutex;
// std::map<std::type_index, std::map<std::string, std::vector<std::function<void(const void *)>>>> _handlers;

// template <typename EventType>
//     using EventHandlerFunc = std::function<void(const EventType &)>;

//     /**
//      * 注册事件监听器
//      * @param eventName 事件名称
//      * @param className 事件处理函数
//      * @param listener 注册类的指针
//      */
//     template <typename EventType, typename T>
//     void on(const std::string &eventName, EventHandlerFunc<EventType> listener, const T *instance);

//     /**
//      * 触发事件
//      * @param eventName 事件名称
//      * @param event 事件数据
//      */
//     template <typename EventType, typename T>
//     void emit(const std::string &eventName, const EventType &event);

//     /**
//      * 移除指定事件
//      */
//     template <typename EventType, typename T>
//     void removeListener(const std::string &eventName, EventHandlerFunc<EventType> listener = nullptr, const T *instance);
//     /**
//      * 移除特定类的所有事件监听
//      * @param className 要移除的类名
//      */
//     template <typename T>
//     void removeAll(const T *instance);